
import asyncio
from react.react_node import ReactNode
from langchain_huggingface import HuggingFaceEmbeddings
from langgraph.store.memory import InMemoryStore
from config import Config
from agent.tool_manager import ToolManager
from loguru import logger


async def main(query: str):
    embedding_model = HuggingFaceEmbeddings(
        model_name=Config.EMBEDDING_MODEL,
        model_kwargs={'device': 'cpu'},
        encode_kwargs={'normalize_embeddings': False}
    )
    # 内存记忆
    memory_store = InMemoryStore(index={"embed": embedding_model, "dims": Config.EMBEDDING_DIM})

    tool_manager = ToolManager()
    react = ReactNode(memory_store, tool_manager)
    response = await react.run(session_id='123', query=query, max_steps=5)
    return response


if __name__ == '__main__':
    # asyncio.run(main(query = "四川大学的校长是谁？"))

    query = "明天我要到昆明旅游，从成都磨子桥出发，三天，帮我制定一份详尽的计划"

    steps = {
        1: "调用工具: 获取磨子桥的经纬度范围（作为目的地参考）",
        2: "调用工具: 获取昆明市的经纬度范围（作为目的地参考）",
        3: "调用工具: 规划从成都磨子桥到昆明的交通方案",
        4: "调用工具: 搜索昆明市内热门景点信息",
        5: "调用工具: 根据景点热度排序并筛选出三个代表性景点",
        6: "调用工具: 为每个景点获取其经纬度坐标",
        7: "调用工具: 规划昆明市内各景点之间的步行/骑行路径",
        8: "调用工具: 查询昆明市未来三天的天气情况",
        9: "调用工具: 生成完整的旅行地图行程，并提供高德地图导航链接",
        10: "调用工具: 总结所有步骤结果，形成最终的旅行计划"
    }

    for idx in steps:
        inputs = (f"用户当前提问: {query}，我们需要获取相关信息并对此进行回答，"
                  f"你的分工是：{steps[idx]}，请完成此任务，你仅需要返回结果，不需要附加其他说明。")
        response = asyncio.run(main(query=inputs))
        logger.error(f"{idx} --- {steps[idx]} --- {response}")

#  1 --- 调用工具: 获取昆明市的经纬度范围（作为目的地参考） --- {'output': '昆明市的经纬度范围为：经度102.833669，纬度24.881490。', 'success': True, 'error': None}
#  2 --- 调用工具: 获取昆明市的经纬度范围（作为目的地参考） --- {'output': '昆明市的经纬度范围参考坐标为：经度 102.833669，纬度 24.881490。', 'success': True, 'error': None}
#  3 --- 调用工具: 规划从成都磨子桥到昆明的交通方案 --- {'output': '从成都磨子桥到昆明的交通方案如下：\n\n1. **地铁 + 高铁（推荐）**：\n   - 步行至磨子桥地铁站，乘坐地铁3号线前往春熙路，再换乘地铁4号线到达成都西站。\n   - 在成都西站搭乘高铁（如G2803次），约6小时左右抵达昆明南火车站。\n   - 抵达后可选择地铁1号线或公交前往市区目的地。\n\n2. **地铁 + 普通火车**：\n   - 同样先乘坐地铁至成都西站附近。\n   - 转乘普通列车（如Z371次），耗时较长（约15-17小时），直达昆明火车站。\n   - 到达昆明后可换乘地铁1号线或其他公交方式进入市区。\n\n以上方案可根据您的时间安排和预算选择。', 'success': True, 'error': None}
#  4 --- 调用工具: 搜索昆明市内热门景点信息 --- {'output': '昆明市内热门景点包括：石林风景区、滇池、西山森林公园、昆明世博园、金马碧鸡坊、翠湖公园、云南民族村等。', 'success': False, 'error': '动作执行失败: LLM调用超时: >60秒.'}
#  5 --- 调用工具: 根据景点热度排序并筛选出三个代表性景点 --- {'output': '石林风景区、滇池、翠湖公园', 'success': True, 'error': None}
#  6 --- 调用工具: 为每个景点获取其经纬度坐标 --- {'output': '{"昆明石林": "103.290536,24.771761", "昆明滇池": "102.703812,24.850726", "昆明世博园": "102.756008,25.074062", "昆明翠湖公园": "102.742862,25.043846"}', 'success': True, 'error': None}
#  7 --- 调用工具: 规划昆明市内各景点之间的步行/骑行路径 --- {'output': '昆明市内主要景点之间的步行/骑行路径规划如下：\n\n1. **官渡古镇 → 石林风景区**：\n   - 步行距离：约5060米，耗时约4048秒（约67分钟）。\n   - 骑行距离：约5105米，耗时约1225秒（约20分钟）。\n\n2. **石林风景区 → 云南民族村**：\n   - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n3. **云南民族村 → 昆明动物园**：\n   - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n4. **昆明动物园 → 官渡森林公园**：\n   - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n5. **官渡森林公园 → 大观楼**：\n   - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n6. **大观楼 → 昆明瀑布公园**：\n   - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n7. **昆明瀑布公园 → 宝丰湿地公园一期**：\n   - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n8. **宝丰湿地公园一期 → 云南野生动物园**：\n   - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n9. **云南野生动物园 → 黑龙潭公园**：\n   - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n10. **黑龙潭公园 → 金殿风景名胜区**：\n    - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n11. **金殿风景名胜区 → 滇池海埂公园**：\n    - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n12. **滇池海埂公园 → 宜良九乡风景区**：\n    - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n13. **宜良九乡风景区 → 翠湖公园**：\n    - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n14. **翠湖公园 → 云南陆军讲武堂旧址**：\n    - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n15. **云南陆军讲武堂旧址 → 云南民族大观园**：\n    - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n16. **云南民族大观园 → 宝海公园**：\n    - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n17. **宝海公园 → 圆通禅寺**：\n    - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n18. **圆通禅寺 → 官渡广场**：\n    - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n19. **官渡广场 → 龙门生态公园**：\n    - 暂未获取具体路线信息，建议使用地图工具进一步查询或选择公共交通方式。\n\n如需进一步详细路线，请提供具体的起点和终点名称，以便进行更精确的路径规划。', 'success': True, 'error': None}
#  8 --- 调用工具: 查询昆明市未来三天的天气情况 --- {'output': '昆明市未来三天的天气情况如下：\n\n- **2025年9月9日（星期二）**：白天小雨，气温25℃；夜间小雨，气温17℃，风力均为1-3级。\n- **2025年9月10日（星期三）**：白天小雨，气温24℃；夜间中雨，气温17℃，风力均为1-3级。\n- **2025年9月11日（星期四）**：白天小雨，气温23℃；夜间小雨，气温17℃，风力均为1-3级。\n\n建议您带上雨具，并根据天气情况合理安排行程。', 'success': True, 'error': None}
#  9 --- 调用工具: 生成完整的旅行地图行程，并提供高德地图导航链接 --- {'output': '[{"name":"成都磨子桥","location":{"lat":"30.629367","lon":"104.078525"},"title":"出发地：成都磨子桥"},{"name":"昆明市","location":{"lat":"24.881490","lon":"102.833669"},"title":"目的地：昆明市"}]', 'success': True, 'error': None}
# 10 --- 调用工具: 总结所有步骤结果，形成最终的旅行计划 --- {'output': '### 昆明三日游旅行计划（从成都磨子桥出发）\n\n---\n\n#### **第一天：成都 → 昆明 + 滇池 + 云南民族村 + 西山**\n\n**交通方式：**\n- 建议乘坐高铁或动车，从成都东站到昆明南站。全程约5.5小时。\n- 或选择普通火车（Z371次），耗时较长但票价相对便宜。\n\n**行程安排：**\n1. **上午：成都出发前往昆明**\n   - 出发时间建议在早上8点左右，确保中午前抵达昆明。\n2. **下午：滇池游览**\n   - 到达后可先去滇池，欣赏高原湖泊的壮丽风光，可在海埂大坝喂海鸥。\n3. **傍晚：云南民族村**\n   - 感受云南多民族风情，了解各少数民族的文化和建筑特色。\n4. **晚上：西山龙门**\n   - 登上西山，参观龙门石窟，感受佛教文化与自然景观的融合。\n   - 若体力充足，还可游览华亭寺、太和宫等景点。\n\n---\n\n#### **第二天：石林风景区 + 翠湖公园**\n\n**行程安排：**\n1. **上午：石林风景区**\n   - 石林是世界自然遗产，距离昆明市区约90公里，建议早起乘车前往。\n   - 游览大石林、小石林等地貌奇观，观看彝族歌舞表演。\n2. **下午：返回市区 + 翠湖公园**\n   - 返回昆明后，可漫步翠湖公园，享受湖光山色和城市绿意。\n   - 周边有云南大学，可以顺便参观。\n3. **晚上：自由活动**\n   - 可逛逛南屏街，品尝昆明小吃，如过桥米线、鲜花饼等。\n\n---\n\n#### **第三天：九乡溶洞 + 返程**\n\n**行程安排：**\n1. **上午：九乡溶洞**\n   - 九乡是集山水峡谷、溶洞奇观于一体的旅游胜地，距昆明市区约60公里。\n   - 推荐游览水洞和旱洞，体验地下溶洞的神秘与壮观。\n2. **下午：返程准备**\n   - 根据航班或列车时间，提前前往机场或车站，结束愉快旅程。\n   - 若时间充裕，可顺路再逛一逛昆明市区的商业区，购买纪念品。\n\n---\n\n#### **注意事项：**\n- 昆明气候温和，但早晚温差较大，建议携带薄外套。\n- 提前预订酒店和景区门票，避免高峰期排队。\n- 交通以高铁为主，若预算有限也可选择普通火车，注意提前订票。\n\n祝您旅途愉快！', 'success': True, 'error': None}
